<?php
C_base::yn_file('m'.DS.'material'.DS.'materialModel.php');
class photoModel extends materialModel{
	
	var $litte_size = array(
			'124'=>array('w'=>124,'h'=>124),
			'150'=>array('w'=>150,'h'=>150),
			'170'=>array('w'=>170,'h'=>170),
			'80'=>array('w'=>80,'h'=>80),
			'800'=>array('w'=>800,'h'=>600)
	);
	
	function __construct(){
		$con = C_base::M('admin.base')->con_s();
		$imgtype = @$con['imgtype'] ? $con['imgtype'] : 'jpg,jpeg,png,gif,bmp';
		$this->imgtype = explode(',',$imgtype);
		
	}

	/**
	 * 获取图片
	 * $id 图片id
	 * $key 密匙
	 * $size 图片尺寸
	 */
	function get($id,$key='',$size=''){
		$fg = explode('_', $id);//分割取出表id和图片id
		if(is_array($fg)){
			$cha = $this->cha($fg[0],array('id'=>$fg[1]));//查看图片信息
			if($cha){
				$one = substr($cha['md5'],0,2);//一级文件夹名称
				$two = substr($cha['md5'],2,2);//二级文件夹名称
				$lj = IMG.$one.DS.$two.DS.$cha['md5'].'.'.$cha['type'];//图片地址
				if(is_file($lj)){//如果存在直接获取内容进行输出
					$key = @$key ? $key : MTR_KEY;
					$jianr = file_get_contents($lj);//获取图片内容(已加密)
					$nr = util::jiemi($jianr,$key);//解密图片内容
					if($size){//如果存在图片尺寸
						$slj = IMG.$one.DS.$two.DS.$cha['md5'].'_'.$size.'.'.$cha['type'];//图片地址
						if(is_file($slj)){//如果存在直接获取内容进行输出
							$slt = file_get_contents($slj);//获取缩略图的内容
							$nr = util::jiemi($slt,$key);
						}else{//如果不存在执行下面的生成缩略图
							$im = @imagecreatefromstring($nr);//图片内容处理
							$im = $this->resize($im,$size);//缩放图片
							@imagejpeg($im,$slj);//写入到图片(这时写入的图片是未加密的)
							$nr = file_get_contents($slj);//获取刚刚写入的图片内容
							$jianr = util::jiami($nr,$key);//启用加密设置对刚刚写入的图片进行加密
							file_put_contents($slj, $jianr);//重新写入加密后的文件内容覆盖原缩略图文件
						}
					}
				}else{
					$nr = @file_get_contents(IMG.'moren.png');//默认比例大小图片不存在情况下读取原图
					if($size){
						$mlj = IMG.'moren_'.$size.'.png';//按size的大小去读取这副缩略图是否存在
						if(is_file($mlj)){
							$nr = file_get_contents($mlj);//如果这张默认的比例大小图片存在则直接输出
						}else{
							$im = @imagecreatefromstring($nr);//图片内容处理
							$im = $this->resize($im,$size);//缩放图片
							@imagejpeg($im,$mlj);//写入到图片
							$nr = file_get_contents($mlj);//获取刚刚写入的图片内容
						}
					}
				}
				return $nr;
			}
		}
	}
	
	function del($id){//删除图片
		$fg = explode('_', $id);//分割取出表id和图片id
		if(is_array($fg)){
			$cha = $this->cha($fg[0],array('id'=>$fg[1]));//查看图片信息
			if($cha){
				$one = substr($cha['md5'],0,2);//一级文件夹名称
				$two = substr($cha['md5'],2,2);//二级文件夹名称
				$lj = IMG.$one.DS.$two.DS.$cha['md5'].'.'.$cha['type'];//图片地址
				if(!unlink($lj)){
					return 0;
				}else{
					$shan = $this->shan($fg[0],array('id'=>$fg[1]));
					return $shan;
				}
			}
		}
	}
	
	/**
	 * 保存图片
	 * $post=array('type'=>$type,'content'=>$content,'key'=>$key);
	 * $type 图片类型
	 * $content 图片内容
	 * $key 密匙
	 */
	function save($post = array()){
		extract($post);
		$type = strtolower($type);//转小写
		if(!in_array($type, $this->imgtype)){//判断是否是允许上传的类型
			return '';//不符合文件上传类型
		}
		$id = '';
		if($key != MTR_KEY){//如果是加密用户自有的加密方法加密。那么多出来一份图片为使用默认密码加密的
			$nr = util::jiami($content,MTR_KEY);
			$id = $this->share($nr,$type);
		}
		$nr = util::jiami($content,$key);//启用加密设置对上传上来的图片进行加密
		$kid = $this->share($nr,$type);
		return $kid.'|'.$id;
	}
	
	/**
	 * 更新图片
	 * $id 图片id
	 * $key 新密匙
	 */
	function update($id,$key){
		$fg = explode('_', $id);//分割取出表id和图片id
		if(is_array($fg)){
			$cha = $this->cha($fg[0],array('id'=>$fg[1]));//查看图片信息
			if($cha){
				$one = substr($cha['md5'],0,2);//一级文件夹名称
				$two = substr($cha['md5'],2,2);//二级文件夹名称
				$lj = IMG.$one.DS.$two.DS.$cha['md5'].'.'.$cha['type'];//图片地址
				$jianr = file_get_contents($lj);//获取图片内容(已加密)
				$jienr = util::jiemi($jianr,MTR_KEY);//解密图片内容
				$nr = util::jiami($jienr,$key);//加密原始图片内容
				$id = $this->share($nr,$cha['type']);
				return $id;
			}
		}
	}
	
	/**
	 * 切割图像
	 * $post=array('key'=>$key,'id'=>$id,'dw'=>$dw,'dh'=>$dh,'w'=>$w,'h'=>$h,'x'=>$x,'y'=>$y,'siz'=>$siz);
	 * $key 密匙
	 * $id //原图片id
	 * $x 原x坐标点
	 * $y 原y坐标点
	 * $w 原宽度
	 * $h 原高度
	 * $dw 目标宽度
	 * $dh 目标高度
	 * $siz 尺寸
	 */
	function split($post = array()){
		extract($post);
		$fg = explode('_', $id);//分割取出表id和图片id
		if(is_array($fg)){
			$cha = $this->cha($fg[0],array('id'=>$fg[1]));//查看图片信息
			if($cha){
				$one = substr($cha['md5'],0,2);//一级文件夹名称
				$two = substr($cha['md5'],2,2);//二级文件夹名称
				$lj = IMG.$one.DS.$two.DS.$cha['md5'].'.'.$cha['type'];//图片地址
				if($siz){//如果有缩放图片的size，则取缩放后的真实图片地址
					$lj = IMG.$one.DS.$two.DS.$cha['md5'].'_'.$siz.'.'.$cha['type'];//图片地址
				}
				if(is_file($lj)){
					$jianr = file_get_contents($lj);//获取图片内容(已加密)
					$jienr = util::jiemi($jianr,$key);//解密图片内容
					$src = imagecreatefromstring($jienr);//原图像链接资源
					$im = imagecreatetruecolor($dw,$dh);//目标图像链接资源
					//目标图象连接资源，原图像链接资源，目标X坐标点，目标Y坐标点,原X坐标点，原Y坐标点，目标宽度，目标高度，原宽度，原高度
					imagecopyresampled($im,$src,0,0,$x,$y,$dw,$dh,$w,$h);//重采样拷贝部分图像并调整大小
					$temp = IMG.'temps'.DS.$cha['md5'].'.jpg';
					if(!is_file($temp)){
						imagejpeg($im,$temp);//输出图象到浏览器或文件
					}
					$imnr = file_get_contents($temp);
					$nr = util::jiami($imnr,$key);
					$id = $this->share($nr,$cha['type']);
					return $id;
				}
			}
		}
	}
	
	/**
	 * 缩放图像
	 * $im 缩放图片
	 * $size 缩放尺寸
	 */
	function resize($im,$size){
		$size_set = $this->litte_size[$size];//获取要缩放的尺寸
		$maxwidth = $size_set['w'];
		$maxheight = $size_set['h'];
		$pic_width = imagesx($im);//取得当前图片的宽度。
		$pic_height = imagesy($im);//取得当前图片的高度
		if($pic_width > $maxwidth){//如果当前图片的宽度大于要缩放的宽度则计算当前图片比实际图片的宽度大多少。
			$jwidth = $pic_width - $maxwidth;//计算得住当前图片比要缩放后图片大于的宽度
		}else{//如果当前图片的宽度并不大于缩放后图片的宽度
			if($pic_height > $maxheight){//计算当前图片的高度是否大于缩放后图片的高度
				$jheight = $pic_height - $maxheight;//计算得出当前图片比缩放后图片大出多少。
			}else{//如果当前宽度不大于缩放后宽度，当前高度也不大于缩放后高度。返回这张图片。
				return $im;
			}
		}
		$jwidth = $jwidth ? $jwidth : 0;//在此设置防止上面值为空下面报错
		$jheight = $jheight ? $jheight : 0;//在此设置防止上面值为空下面报错
		if($jwidth > $jheight){//如果当前图片的高度或者宽度大于缩放后的宽度或者高度。那么在此做比较。比较出以宽或者高为基准进行缩放。
			//如果此处执行。以宽度为基准进行缩放
			$newwidth = $maxwidth;//新的宽度等于宽度的最大值。
			$newheight = $pic_height - $jwidth/2;//新的高度等于原始高度减少宽度缩放的尺寸达到等比例
			if($newheight > $maxheight){//新的高度出来后再进行计算。看看是否大于要缩放的高度。如果大于的话重新以高度进行计算，缩放宽度。
				$lheight = $newheight - $maxheight;//临时计算用高度值。得出新的高度比要缩放到的高度错了多少。
				if($maxwidth != $maxheight){
					$newwidth = $newwidth - $lheight/2;//设定当前宽度为高度减少的值后的宽度。
				}
				$newheight = $maxheight;//设定当前高度为预设定的高度
			}
		}else{
			//如果此处执行。以高度为基准进行缩放
			$newheight = $maxheight;//设定当前高度为预设定的高度
			$newwidth = $pic_width - $jheight/2;
			if($newwidth > $maxwidth){//新的高度出来后再进行计算。看看是否大于要缩放的高度。如果大于的话重新以高度进行计算，缩放宽度。
				$lwidth = $newwidth - $maxwidth;//临时计算用高度值。得出新的高度比要缩放到的高度错了多少。
				if($maxwidth != $maxheight){
					$newheight = $newheight - $lwidth/2;//设定当前宽度为高度减少的值后的宽度。
				}
				$newwidth = $maxwidth;	//设定当前高度为预设定的高度
			}
		}
		if($newwidth < 1){
			$newwidth = 1;
		}
		if($newheight < 1){
			$newheight = 1;
		}
		$newim = imagecreatetruecolor($newwidth,$newheight);
		imagecopyresampled($newim, $im, 0, 0, 0 ,0, $newwidth, $newheight, $pic_width, $pic_height);
		return $newim;
	}
	
	/**
	 * 公共调用部分
	 * $nr 文件内容
	 * $type 文件类型
	 */
	function share($nr,$type){//公共调用部分
		$md5 = md5($nr);//文件名称
		$int = util::md5_int($md5);//md5转数字
		$mid = util::end2($int);//取最后两位
		$pd = $this->cha($int,array('md5'=>$md5));//判断是否存在
		if($pd){
			$id = $pd['id'];
		}else{
			if(!is_dir(IMG)){//判断文件夹是否存在
				mkdir(IMG,0777);//创建目录，最大访问权限
			}
			$one = substr($md5,0,2);//一级文件夹名称
			$ml = IMG.$one.DS;//一级文件夹
			if(!is_dir($ml)){//判断一级文件夹是否存在
				mkdir($ml,0777);//创建目录，最大访问权限
			}
			$two = substr($md5,2,2);//二级文件夹名称
			$ml .= $two.DS;//二级文件夹
			if(!is_dir($ml)){//判断二级文件夹是否存在
				mkdir($ml,0777);//创建目录，最大访问权限
			}
			$lj = $ml.$md5.'.'.$type;//图片文件路径
			if(is_file($lj)){
				unlink($lj);
			}
			file_put_contents($lj, $nr);//写入
			$arr = array('mid'=>$mid,'type'=>$type,'md5'=>$md5,'time'=>time());
			$id = $this->xie($int,$arr);//写入数据
		}
		return $mid.'_'.$id;
	}
	
	
	function get_tpname($id){		
		if(@$id){
			$fg = explode('_', $id);//分割取出表id和图片id
			if(is_array($fg)){
				$cha = $this->cha($fg[0],array('id'=>$fg[1]));//查看图片信息
				if($cha){
					$lj = $cha['md5'].'.'.$cha['type'];//图片地址
				}else{
					$lj = '';
				}
			}
			return $lj;
		}
	}
}